/////////////////////////////////////////////////////////////////////////

package sheep.view;

/////////////////////////////////////////////////////////////////////////

import java.awt.AlphaComposite;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
import sheep.view.graphics2d.GraphicsUtil;
import java.awt.LinearGradientPaint;

import org.jdesktop.fuse.InjectedResource;
import org.jdesktop.fuse.ResourceInjector;

/////////////////////////////////////////////////////////////////////////

// Panel de fond de l'application general ( degrade)
class ContentPanel extends JPanel {

  /////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////
    // Attributs initialisé depuis le fichier ressource
    ////////////////////////////////////////////////////////////////////////////
    @InjectedResource
    private LinearGradientPaint backgroundGradient;
    @InjectedResource
    private BufferedImage light;
    @InjectedResource
    private float lightOpacity;

    // Image intermediaire
    private Image gradientImage = null;
    // Taille pour savoir si on doit recalculer l'image
    private int width;
    private int height;
    
    /////////////////////////////////////////////////////////////////////////

    // Initialisation du panel
    ContentPanel() {
        // Recuperation des ressources
        ResourceInjector.get().inject(this);
    }

    /////////////////////////////////////////////////////////////////////////

    @Override
    protected void paintComponent(Graphics g) {
        //Si on es pas visible, on quitte
        if (!isVisible()) 
            return;
        // On recuperer le graphics du panel
        Graphics2D g2 = (Graphics2D) g;
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        // On creer une seul fois l'image
        if (gradientImage == null || width != getWidth() || height  != getHeight()) {
            width = getWidth(); height= getHeight();
            // On creer l'image
            gradientImage = GraphicsUtil.createCompatibleImage(getWidth(), getHeight());
            // On la transforme en graphics
            Graphics2D g2d = (Graphics2D) gradientImage.getGraphics();
            // On sauvegarde la composite
            Composite composite = g2.getComposite();
            // On cofigure l'affichage
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                                RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            // On definit le fond
            g2d.setPaint(backgroundGradient);
            // On l'applique au panel
            g2d.fillRect(0, 0, getWidth(), getHeight());
            // On ajoute un effet de teransparence
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
                             lightOpacity));
            // On ajoute l'eclaircissement en haut
            g2d.drawImage(light, 0, 0, getWidth(), light.getHeight(), null);
            // On reapplique la composite
            g2d.setComposite(composite);
            g2d.dispose();
        }
        // On dessine le fond
        g2.drawImage(gradientImage, 0, 0, null);
    }
   
    /////////////////////////////////////////////////////////////////////////

}

/////////////////////////////////////////////////////////////////////////
